package com.tz.test.aop;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CgLibProxyFactory implements MethodInterceptor {

    private Object target;

    public CgLibProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy(Class clazz) {
//         创建增强器
        Enhancer enhancer = new Enhancer();
//        Enhancer
        // 设置需要增强的类的类对象
        enhancer.setSuperclass(clazz);
        // 设置回调函数
//        Callback[] callbacks = new Callback[] {this};
        enhancer.setCallback(this);
//        Object o = enhancer.create();
        // 获取增强之后的代理对象
        return enhancer.create();
    }

    private void aopMethod() {
        System.out.println("在执行方法前会执行此方法");
    }

    /***
     * Object proxy:这是代理对象，也就是[目标对象]的子类
     * Method method:[目标对象]的方法
     * Object[] arg:参数
     * MethodProxy methodProxy：代理对象的方法
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("methodProxy:" + methodProxy.toString());
        System.out.println("method:" + method.toString());
        System.out.println("这是cglib的代理方法");
        aopMethod();
        method.invoke(target,args);
// 通过调用子类[代理类]的invokeSuper方法，去实际调用[目标对象]的方法
// 代理对象调用代理对象的invokeSuper方法，而invokeSuper方法会去调用目标类的
        //invoke方法完成目标对象的调用
        return methodProxy.invokeSuper(proxy, args);
    }
}
